Non-volatile memory devices, such as universal serial bus (USB) flash memory devices or removable storage cards, have allowed for increased portability of data and software applications. Flash memory devices can enhance data storage density by storing multiple bits in each flash memory cell. For example, Multi-Level Cell (MLC) flash memory devices provide increased storage density by storing 3 bits per cell, 4 bits per cell, or more.
Storing multiple bits of information in a single flash memory cell typically includes mapping sequences of bits to states of the flash memory cell. For example, a first sequence of bits “110” may correspond to a first state of a flash memory cell and a second sequence of bits “010” may correspond to a second state of the flash memory cell. After determining that a sequence of bits is to be stored into a particular flash memory cell, the flash memory cell may be programmed to a state that corresponds to the sequence of bits.
Alternatively, multiple bits of information in a single flash memory cell may be stored as relative voltage levels of multiple cells of the memory rather than as absolute voltage levels in each cell. For example, each storage element of the memory may have a threshold voltage corresponding to a state of the storage element. A group of storage elements may store data based on relative threshold voltages of the storage elements in the group. Data may be read from the group of storage elements by ranking the storage elements according to threshold voltages and mapping the ranking to a corresponding data value at a rank modulation decoder.
Once the memory cells in the memory device have been programmed, data may be read from the memory cells by sensing the programming states of the memory cells. However, sensed programming states can sometimes vary from the written programming states due to one or more factors. Error correction decoding can be used to correct data errors resulting from sensed programming states that do not match written programming states.